home *** CD-ROM | disk | FTP | other *** search
/ Wayzata's Best of Shareware PC/Windows 2 / Wayzata's Best of Shareware 2.0 (Windows) (Wayzata Technology)(7112)(1994).bin / pc / dos / programg / decgif3 / wpix2.asm < prev    next >
Assembly Source File  |  1992-08-01  |  7KB  |  340 lines

  1. ;*******************************************************************************
  2. ;* Assembly Subroutines For DECGIF3.BAS
  3. ;* By Rich Geldreich 1992
  4. ;* Assembled with TASM v2.00
  5. ;*
  6. ;* Routines to set lines of pixels for the 320x200x256 mode, 
  7. ;* X320x240x256 & X360x480x256 undocumented modes, and 16 color modes.
  8. ;*
  9. ;* (Sorry it's not documented yet!) 
  10. .286
  11. Ideal
  12. Model Small
  13.  
  14. Public SetPixels, SetMode, SetWidth
  15.  
  16. Macro   SepPlanes
  17.         Lodsb
  18.         Inc     si
  19.         Shr     al, 1
  20.         Rcl     bl, 1
  21.         Shr     al, 1
  22.         Rcl     bh, 1
  23.         Shr     al, 1
  24.         Rcl     dl, 1
  25.         Shr     al, 1
  26.         Rcl     dh, 1
  27. Endm
  28.  
  29.  
  30. Codeseg
  31. Even
  32. ScreenWidth     dw 90
  33. ScreenOffset    dw 0
  34. JumpTable       dw VGAN, VGAX, EGA
  35. VidMode         dw VGAN
  36.  
  37. TStart          dw 0
  38. TNum            dw 0
  39.  
  40. Even
  41. Proc    SetPixels ;XOffset, A() X  Y N
  42.                   ;   14    12  10 8 6
  43.                   
  44.         Push    bp
  45.         Mov     bp, sp
  46.         Push    es ds si di
  47.         
  48.         Mov     ax, 0A000h
  49.         Mov     es, ax
  50.         
  51.         Mov     di, [ss:bp+12]
  52.         Mov     si, [ds:di+0Ah]
  53.         Mov     ds, [ds:di+02h]
  54.         Mov     ax, [ss:bp+14]
  55.         Shl     ax, 1
  56.         Add     si, ax
  57.         
  58.         Jmp     [cs:VidMode]
  59.         Even
  60. VGAN:
  61.         Imul    di, [ss:bp+8], 320
  62.         Add     di, [ss:bp+10]
  63.         Mov     cx, [ss:bp+6]
  64.         Jcxz    @@7
  65. ;This *should* be in-line coded for maximum speed, but the decompressor
  66. ;is so slow it didn't make much of a difference so I left out this 
  67. ;optimization.
  68.         Even
  69. @@5:
  70.         Movsb
  71.         Inc     si
  72.         Loop    @@5
  73. @@7:                
  74.         Pop     di si ds es bp
  75.         Retf    10
  76.         Even
  77. VGAX:                   
  78.         Mov     cx, [ss:bp+10]
  79.         Mov     di, cx
  80.         Shr     di, 2
  81.         
  82.         Mov     ax, [cs:ScreenWidth]
  83.         Mul     [word ss:bp+08]
  84.         Add     di, ax
  85.         Add     di, [cs:ScreenOffset]
  86.         
  87.         Mov     dx, 03C4h
  88.         Mov     al, 2
  89.         Out     dx, al
  90.  
  91.         And     cl, 03h
  92.         Mov     al, 1
  93.         Shl     al, cl
  94.         Mov     cx, [ss:bp+06]
  95.         Jcxz    @@exit
  96.         Mov     bp, 4
  97. @@10:
  98.         Mov     dx, 03C5h
  99.         Out     dx, al
  100.         
  101.         Push    si di cx
  102.         
  103.         Add     cx, 3
  104.         Shr     cx, 2
  105.         Mov     dx, cx
  106.         Shr     cx, 3
  107.         And     dx, 07h
  108.         Mov     bx, dx
  109.         Shl     dx, 1
  110.         Add     dx, bx
  111.         Neg     dx
  112.         Add     dx, offset @@20
  113.         Mov     bx, 7
  114.         Jmp     dx
  115.         
  116.         Rept    7
  117.         Movsb
  118.         Add     si, bx
  119.         Endm
  120. @@20:
  121.         Jcxz    @@40
  122.         Even
  123. @@30:
  124.         Rept    8
  125.         Movsb
  126.         Add     si, bx
  127.         Endm
  128.         Loop    @@30                                                
  129. @@40:
  130.         Pop     cx di si
  131.         Inc     si
  132.         Inc     si
  133.         
  134.         Shl     al, 1
  135.         Cmp     al, 16
  136.         Je      @@Sp1
  137.  
  138.         Dec     bp
  139.         Loopnz  @@10
  140. @@Exit:        
  141.         Pop     di si ds es bp
  142.         Retf    10
  143.         Even
  144. @@Sp1:
  145.         Inc     di
  146.         Mov     al, 1
  147.         Dec     bp
  148.         Loopnz  @@10
  149.         Jmp     @@Exit
  150.         Even
  151. EGA:
  152.         Mov     ax, [cs:ScreenWidth]
  153.         Mul     [word ss:bp+8]
  154.         Mov     di, ax
  155.         Mov     ax, [ss:bp+10]
  156.         Mov     cx, ax
  157.         Shr     ax, 3
  158.         Add     di, ax
  159.         Add     di, [cs:ScreenOffset]
  160.  
  161.         Mov     bp, [ss:bp+06]
  162.         And     bp, bp
  163.         Jz      @@Exit
  164.         Mov     [cs:TNum], bp
  165.         
  166.         Mov     dx, 03C4h
  167.         Mov     al, 2
  168.         Out     dx, al
  169.         
  170.         Mov     dl, 0CEh        
  171.         Mov     al, 8
  172.         Out     dx, al
  173.         
  174.         And     cx, 7
  175.         
  176.         Jcxz    @@ByteAligned
  177.         Neg     cx
  178.         Add     cx, 8
  179.                 
  180.         Xor     bx, bx
  181.         Mov     dx, bx
  182.         Mov     ah, 0ffh
  183.         Even
  184. @@EG1:        
  185.         SepPlanes
  186.         Shl     ah, 1
  187.         Dec     bp
  188.         Loopnz  @@EG1
  189.         Shl     bx, cl
  190.         Shl     dx, cl
  191.         Rol     ah, cl
  192.         Mov     [cs:TNum], bp
  193.         
  194.         Mov     bp, dx
  195.         Mov     dx, 03CFh
  196.         Mov     al, ah
  197.         Not     al
  198.         Out     dx, al
  199.         Mov     dl, 0C5h
  200.         Mov     al, [es:di]
  201.         
  202.         Mov     al, 1
  203.         Out     dx, al
  204.         Mov     [es:di], bl
  205.         Shl     al, 1
  206.         Out     dx, al
  207.         Mov     [es:di], bh
  208.         Shl     al, 1
  209.         Out     dx, al
  210.         Mov     bx, bp
  211.         Mov     [es:di], bl
  212.         Shl     al, 1
  213.         Out     dx, al
  214.         Mov     [es:di], bh
  215.         
  216.         Mov     dl, 0CFh
  217.         Mov     al, 0ffh
  218.         Out     dx, al
  219.         
  220.         Inc     di
  221.         Even
  222. @@ByteAligned:
  223.         Mov     bp, 03C5h
  224.         Mov     cx, [cs:TNum]
  225.         Shr     cx, 3
  226.         And     cx, cx
  227.         Jnz     @@EG2
  228.         Jmp     @@NoRuns
  229.         Even
  230. @@EG2:
  231.         Xor     bx, bx
  232.         Mov     dx, bx
  233.         
  234.         Rept    8
  235.         SepPlanes
  236.         Endm
  237.                         
  238.         Xchg    bp, dx
  239.         Mov     al, 1
  240.         Out     dx, al
  241.         Mov     [es:di], bl
  242.         Shl     al, 1
  243.         Out     dx, al
  244.         Mov     [es:di], bh
  245.         Shl     al, 1
  246.         Out     dx, al
  247.         Mov     bx, bp
  248.         Mov     [es:di], bl
  249.         Shl     al, 1
  250.         Out     dx, al
  251.         Mov     [es:di], bh
  252.         Mov     bp, dx
  253.         
  254.         Inc     di
  255.         Dec     cx
  256.         Jz      @@NoRuns
  257.         Jmp     @@EG2
  258.         Even        
  259. @@NoRuns:
  260.         Mov     cx, [cs:TNum]
  261.         And     cx, 7
  262.         Jcxz    @@AllDone
  263.         
  264.         Xor     bx, bx
  265.         Mov     dx, bx
  266.         Mov     ah, 0ffh
  267.  
  268.         Push    cx
  269.         Even
  270. @@EG3:
  271.         SepPlanes
  272.         Shl     ah, 1
  273.         Loop    @@EG3
  274.         Pop     cx
  275.  
  276.         Neg     cl
  277.         Add     cl, 8
  278.         Shl     bx, cl
  279.         Shl     dx, cl
  280.         Rol     ah, cl
  281.         
  282.         Xchg    bp, dx
  283.         Mov     dl, 0CFh
  284.         Mov     al, ah
  285.         Not     al
  286.         Out     dx, al
  287.         Mov     dl, 0C5h
  288.         Mov     al, [es:di]
  289.         
  290.         Mov     al, 1
  291.         Out     dx, al
  292.         Mov     [es:di], bl
  293.         Shl     al, 1
  294.         Out     dx, al
  295.         Mov     [es:di], bh
  296.         Shl     al, 1
  297.         Out     dx, al
  298.         Mov     bx, bp
  299.         Mov     [es:di], bl
  300.         Shl     al, 1
  301.         Out     dx, al
  302.         Mov     [es:di], bh
  303.         
  304.         Mov     al, 0fh
  305.         Out     dx, al
  306.         
  307.         Mov     dl, 0CFh
  308.         Mov     al, 0ffh
  309.         Out     dx, al
  310. @@AllDone:
  311.         Pop     di si ds es bp
  312.         Retf    10        
  313. Endp    SetPixels
  314.  
  315. Proc    SetMode
  316.         Push    bp
  317.         Mov     bp, sp
  318.  
  319.         Mov     bx, [ss:bp+06]
  320.         Shl     bx, 1
  321.         Add     bx, offset JumpTable
  322.         Mov     ax, [cs:bx]
  323.         Mov     [cs:VidMode], ax
  324.         
  325.         Pop     bp
  326.         Retf    2
  327. Endp    SetMode
  328. Proc    SetWidth
  329.         Push    bp
  330.         Mov     bp, sp
  331.         
  332.         Mov     ax, [ss:bp+06]
  333.         Mov     [cs:ScreenWidth], ax
  334.         
  335.         Pop     bp
  336.         Retf    2
  337. Endp    SetWidth
  338. End
  339.                 
  340.